/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


package br.DAO;

import br.Modelo.Cliente;
import br.Modelo.Cidade;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;




public class ClienteDAO {
     
     public static void Salvar(Cliente cliente)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("insert into Cliente(CODIGO_CLI, NOME_CLI, CPF_CLI, LOGRA_CLI, NUM_CLI, BAIRRO_CLI, CIDADE_CLI) "
                 + "values(?,?,?,?,?,?,?)");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setString(2, cliente.getNome());
             insereSt.setDouble(3, cliente.getCPF());
             insereSt.setString(4, cliente.getLogradouro());
             insereSt.setInt(5, cliente.getNumero());
             insereSt.setString(6, cliente.getBairro());
             insereSt.setDouble(7, cliente.getCidade().getCodigoCidade());
             
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             JOptionPane.showMessageDialog(null, "Erro ao incluir cidade: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar conexão: " + e.getMessage());
             }
         }
     }
     
     public static void Alterar(Cliente cliente)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("UPDATE cliente SET CODIGO_CLI = ?, NOME_CLI = ?, CPF_CLI = ?, LOGRA_CLI = ?, NUM_CLI = ?, BAIRRO_CLI = ?, CIDADE_CLI = ? WHERE CODIGO_CLI = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             //insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setDouble(1, cliente.getCodigoCliente());
             insereSt.setString(2, cliente.getNome());
             insereSt.setDouble(3, cliente.getCPF());
             insereSt.setString(4, cliente.getLogradouro());
             insereSt.setInt(5, cliente.getNumero());
             insereSt.setString(6, cliente.getBairro());
             insereSt.setDouble(7, cliente.getCidade().getCodigoCidade());
             insereSt.setDouble(8, cliente.getCodigoCliente());
             
             
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao alterar cidade: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão: " + e.getMessage());
             }
         }
     }
     
     public static void Excluir(Cliente cliente)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("DELETE FROM cliente WHERE CODIGO_CLI = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             insereSt.setDouble(1, cliente.getCodigoCliente());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao excluir cliente: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão" + e.getMessage());
             }
         }
     }
     
     public static int PegaProximoCodigo()
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Statement consulta = null;
         ResultSet resultado = null;
         int ProximoCodigo = 1;
         
         String sql = "SELECT MAX(codigo_cli) AS maior_codigo FROM Cliente;";
         
         try
         {
             consulta = (Statement)conexao.createStatement();
             resultado = consulta.executeQuery(sql);
             
             resultado.next();
             ProximoCodigo = resultado.getInt("maior_codigo");
             ProximoCodigo++;
         }
         catch(SQLException e)
         {
             //JOptionPane.showMessageDialog(null, "Erro na execução da função PegaProximoCodigo" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 //JOptionPane.showMessageDialog(null,"Erro ao fechar a conexão" + e.getMessage());
             }
             finally
             {
                 return ProximoCodigo;
             }
         }
     }
     
     public static Cliente RecuperaObjetoId(Double ID)
     {
         Connection conexao = FabricaConexao.GeraConexao();         
         Cliente clienteRecuperado = new Cliente();
         PreparedStatement consulta = null;
         ResultSet resultado = null;
         
         String sql = "SELECT * FROM Cliente WHERE codigo_cli = ?";
         
         try
         {
             consulta = conexao.prepareStatement(sql);
             consulta.setDouble(1, ID);
             resultado = consulta.executeQuery();
             
             resultado.next();
             
             clienteRecuperado.setCodigoCliente(resultado.getDouble("codigo_cli"));
             clienteRecuperado.setNome(resultado.getString("nome_cli"));
             clienteRecuperado.setCPF(resultado.getDouble("cpf_cli"));
             clienteRecuperado.setLogradouro(resultado.getString("logra_cli"));
             clienteRecuperado.setBairro(resultado.getString("bairro_cli"));
             clienteRecuperado.setNumero(resultado.getInt("num_cli"));
             //clienteRecuperado.setCidade(CidadeDAO.RecuperaObjetoId(resultado.getDouble("cidade_cli")));
             
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao recuperar usuario: " + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão com o BD" + e.getMessage());
             }
             finally
             {
                 return clienteRecuperado;
             }
         }
     }
     
      
      public static ArrayList<Cliente> ListarClientes(String Nome)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          Cidade cid;
          
          ArrayList<Cliente> cliente = new ArrayList<Cliente>();
          Statement consulta = null;
          ResultSet resultado = null;
          
          String sql = "SELECT * FROM cliente ";
          sql = sql + "WHERE NOME_CLI like '%" + Nome + "%'";
          
          try
          {
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(sql);
              
              while(resultado.next())
              {
                  Cliente clienteTemp = new Cliente();
                  clienteTemp.setCodigoCliente(resultado.getDouble("codigo_cli"));
                  clienteTemp.setNome(resultado.getString("nome_cli"));
                  clienteTemp.setCPF(resultado.getDouble("cpf_cli"));
                  clienteTemp.setLogradouro(resultado.getString("logra_cli"));
                  clienteTemp.setBairro(resultado.getString("bairro_cli"));
                  //cid = CidadeDAO.RecuperaObjetoId(resultado.getDouble("codigo_cli"));
                 // clienteTemp.setCidade(cid);
                  
                  cliente.add(clienteTemp);
              }
          }
          catch(SQLException e)
          {
              System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
          }
          finally
          {
              try
              {
                  consulta.close();
                  resultado.close();
                  conexao.close();
              }
              catch(Throwable e)
              {
                  System.out.println("Erro ao fechar a conexão: " + e.getMessage());
              }
              finally
              {
                  return cliente;
              }
          }
      }
      
      private static final int cnstNavPri = 0;
      private static final int cnstNavAnt = 1;
      private static final  int cnstNavProx = 2;
      private static final int cnstNavUlt = 3;
      
      public static String SQLNavegacao(int pOpcao, int pCodigoAtual)
      {
          String SQL = "";
          switch(pOpcao)
          {
              case cnstNavPri:
                  SQL = "SELECT MIN(codigo_cli) AS cod FROM cliente";
                  break;
              case cnstNavAnt:
                  SQL = "SELECT MAX(codigo_cli) AS cod FROM cliente WHERE codigo_cli < " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavProx:
                  SQL = "SELECT MIN(codigo_cli) AS cod FROM cliente WHERE codigo_cli > " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavUlt:
                  SQL = "SELECT MAX(codigo_cli) AS cod FROM cliente";
                  break;
          }
          return SQL;
      }
      
      public static int PegaCodigoPelaNavegacao(int pOpcao, int pCodigoAtual)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          int CodigoEncontrado = -1;
          
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQLNavegacao(pOpcao, pCodigoAtual));
              
              resultado.next();
              CodigoEncontrado = resultado.getInt("cod");
          }
          catch(Exception e){
              JOptionPane.showMessageDialog(null, "Erro ao executar sql de navegação: " + e.getMessage());
          }
          finally{
              try{
                  consulta.close();
                  conexao.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o BD: " + e.getMessage());
              }
          }
          
          return CodigoEncontrado;
      }
      
      public static ArrayList<Cliente> PesquisaObjeto(String sCampo, String sValor, boolean bTodaParte){
          String sql = "SELECT * FROM Cliente WHERE " +  sCampo;
          if(bTodaParte){
              sql = sql + " like '%";
            sql = sql + sValor + "%'";
          }
          else
          {
              sql = sql + " = '" + sValor + "'";
          }
          System.out.println(sql);
          
          return RecuperaObjetos(sql);
      }
      
      private static ArrayList<Cliente> RecuperaObjetos(String sql){
          Connection conexao = FabricaConexao.GeraConexao();
          Cidade cid;
          
          ArrayList<Cliente> cliente = new ArrayList<Cliente>();
          Statement consulta = null;
          ResultSet resultado = null;
          
          try
          {
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(sql);
              
              while(resultado.next())
              {
                  Cliente clienteTemp = new Cliente();
                  clienteTemp.setCodigoCliente(resultado.getDouble("codigo_cli"));
                  clienteTemp.setNome(resultado.getString("nome_cli"));
                  clienteTemp.setCPF(resultado.getDouble("cpf_cli"));
                  clienteTemp.setLogradouro(resultado.getString("logra_cli"));
                  clienteTemp.setBairro(resultado.getString("bairro_cli"));
                  //cid = CidadeDAO.RecuperaObjetoId(resultado.getDouble("codigo_cli"));
                  //clienteTemp.setCidade(cid);
                  
                  cliente.add(clienteTemp);
              }
          }
          catch(SQLException e)
          {
              System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
          }
          finally
          {
              try
              {
                  consulta.close();
                  resultado.close();
                  conexao.close();
              }
              catch(Throwable e)
              {
                  System.out.println("Erro ao fechar a conexão: " + e.getMessage());
              }
              finally
              {
                  return cliente;
              }
          }
      }
}
